strtok関数は、文字列から区切り文字で区切られた字句を取り出します。

#include <string.h>
char *strtok(char *str, const char *delim);

*strは解析対象の文字列を指定します。
*delimnは区切り文字を文字列で指定します。

戻り値として、字句が取り出せた場合は、取り出した字句の文字列を返します。取り出せなかった場合はNULLを返します。

strtok関数を最初に呼び出す際には、第1引数の*strには解析対象の文字列を指定しますが、同じ文字列の解析を引き続き行うための、その後の呼び出しではNULLを指定します。第2引数の*delimnは、その都度変更しても構いません。

解析対象の文字列に2つ以上の区切り文字が連続している場合には、一つの区切り文字とみなします。また、文字列の先頭や末尾にある区切り文字は無視します。

第1引数の*strの内容は変更されてしまいますので、注意してください。

プログラム 例

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define  BUFF_SIZE 1024

int main()
{
  FILE             *fp;
  char             buff[BUFF_SIZE];
  char             *token;

  if ((fp = fopen('beijing_2008.csv', 'r')) == NULL) {
    fprintf(stderr, 'ファイルのオープンに失敗しました\n');
    exit(1);
  }

  /* メンバー情報入力 */
  while(fgets(buff, BUFF_SIZE, fp) != NULL) {
    /* 番号取り出し */
    token = strtok(buff, ',');
    /* 名前取り出し */
    if ((token = strtok(NULL, ',')) != NULL) {
      printf('%s\n', token);
    }
  }

  return 0;
}

例の実行結果

$ cat beijing_2008.csv
1,kurihara,186,69,305
2,tajimi,180,70,309
3,takesita,159,52,280
4,oomura,184,70,319
5,takahasi,170,65,290
6,sano,159,54,260
7,sugiyama,184,66,310
8,sakurai,167,63,290
9,kanou,174,65,298
11,araki,186,79,307
12,kimura,184,66,298
14,kawai,168,63,280
$
$ ./strtok.exe
kurihara
tajimi
takesita
oomura
takahasi
sano
sugiyama
sakurai
kanou
araki
kimura
kawai
$